{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# all_slow"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#hide\n",
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from fastai2.torch_basics import *\n",
    "from fastai2.basics import *\n",
    "from fastai2.data.all import *\n",
    "from fastai2.callback.all import *\n",
    "from fastai2.vision.all import *\n",
    "\n",
    "from fastai2_audio.core.all import *\n",
    "from fastai2_audio.augment.all import *\n",
    "\n",
    "import torchaudio"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Tutorial: Training a Voice Recognition Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "p10speakers = untar_data(URLs.SPEAKERS10, extract_func=tar_extract_at_filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Path('/home/jupyter/.fastai/data/250_speakers/250-speakers')"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#Warning this dataset is ~8GB\n",
    "p250speakers = untar_data(URLs.SPEAKERS250, extract_func=tar_extract_at_filename)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = AudioGetter(\"\", recurse=True, folders=None)\n",
    "files_10  = x(p10speakers)\n",
    "files_250 = x(p250speakers)\n",
    "#original_aud = AudioItem.create(files[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Datablock and Basic End to End Training on 10 Speakers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#crop 2s from the signal and turn it to a MelSpectrogram with no augmentation\n",
    "cfg_voice = AudioConfig.Voice()\n",
    "a2s = AudioToSpec.from_cfg(cfg_voice)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "auds = DataBlock(blocks=(AudioBlock.from_folder(p10speakers, crop_signal_to=2000), CategoryBlock),  \n",
    "                 get_items=get_audio_files, \n",
    "                 splitter=RandomSplitter(),\n",
    "                 item_tfms = a2s,\n",
    "                 get_y=lambda x: str(x).split('/')[-1][:5])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "cats = [y for _,y in auds.datasets(p10speakers)]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#verify categories are being correctly assigned\n",
    "test_eq(min(cats).item(), 0)\n",
    "test_eq(max(cats).item(), 9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dbunch = auds.dataloaders(p10speakers, bs=64)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class = \"alert alert-block alert-warning\"><strong>Broken:</strong><br>Show batch is broken as it appears to just be grabbing the data from the sg, and not the sg object itself, but calls the sg's show method which relies on nchannels, which is an object of AudioSpectrogram (part of sg settings but we overrode getattr to make it work like an attribute). This means that, for the moment, the items cant show themselves for the batch, but training still works </div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#dbunch_cropspec.show_batch(max_n=9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([64, 1, 128, 251])"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dbunch.one_batch()[0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# credit to Kevin Bird and Hiromi Suenaga for these two lines to adjust a CNN model to take 1 channel input\n",
    "def alter_learner(learn, channels=1):\n",
    "    learn.model[0][0].in_channels=channels\n",
    "    learn.model[0][0].weight = torch.nn.parameter.Parameter(learn.model[0][0].weight[:,1,:,:].unsqueeze(1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = Learner(dbunch, \n",
    "                xresnet18(),\n",
    "                torch.nn.CrossEntropyLoss(), \n",
    "                metrics=[accuracy])\n",
    "nchannels = dbunch.one_batch()[0].shape[1]\n",
    "alter_learner(learn, nchannels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "SuggestedLRs(lr_min=0.13182567358016967, lr_steep=0.002511886414140463)"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>1.991590</td>\n",
       "      <td>3.326280</td>\n",
       "      <td>0.278646</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.847196</td>\n",
       "      <td>8.678672</td>\n",
       "      <td>0.238281</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.479046</td>\n",
       "      <td>5.229591</td>\n",
       "      <td>0.401042</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.258239</td>\n",
       "      <td>0.462529</td>\n",
       "      <td>0.851562</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.147350</td>\n",
       "      <td>0.136214</td>\n",
       "      <td>0.953125</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>5</td>\n",
       "      <td>0.097846</td>\n",
       "      <td>0.237540</td>\n",
       "      <td>0.917969</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>6</td>\n",
       "      <td>0.061116</td>\n",
       "      <td>0.046295</td>\n",
       "      <td>0.986979</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>7</td>\n",
       "      <td>0.037137</td>\n",
       "      <td>0.032373</td>\n",
       "      <td>0.992188</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>8</td>\n",
       "      <td>0.028105</td>\n",
       "      <td>0.043614</td>\n",
       "      <td>0.986979</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>9</td>\n",
       "      <td>0.020373</td>\n",
       "      <td>0.030352</td>\n",
       "      <td>0.993490</td>\n",
       "      <td>00:11</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#epochs are a bit longer due to the chosen melspectrogram settings\n",
    "learn.fit_one_cycle(10, lr_max=slice(1e-2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Training on 250 Speakers"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Baseline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "44655"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(files_250)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id09192/mNKRxGRrRJ0/00335.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id08933/E4wYyyC0beQ/00145.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id08953/xCYxdRvg8_k/00444.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id09032/0hG6XOKSOW8/00068.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id09218/aDorKauytkU/00185.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id08863/f_wtkiviSyM/00205.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id09005/u7K6B__BNlE/00226.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id09067/S1lWjI8QJd4/00089.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id08933/uqX-WkPzyqI/00473.wav\n",
      "/home/jupyter/.fastai/data/250_speakers/250-speakers/id08912/6ejahCUmh5c/00019.wav\n"
     ]
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    print(random.choice(files_250))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "get_250speakers_label = lambda x: str(x).split('/')[-3][3:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09016/AV-e0AFMAbg/00080.wav\n",
      "Label: 9016\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id08930/zJdQAtcFSKk/00233.wav\n",
      "Label: 8930\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09051/oBPMFcURM_Y/00399.wav\n",
      "Label: 9051\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09051/oBPMFcURM_Y/00414.wav\n",
      "Label: 9051\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09232/t9D5gndqjm0/00460.wav\n",
      "Label: 9232\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09222/Z_MOryHiFUc/00166.wav\n",
      "Label: 9222\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09237/Nudby-bnL2U/00102.wav\n",
      "Label: 9237\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09030/MeEh71W-Vo8/00131.wav\n",
      "Label: 9030\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id08901/4SHQoasFAdQ/00014.wav\n",
      "Label: 8901\n",
      "File: /home/jupyter/.fastai/data/250_speakers/250-speakers/id09171/P9A6WcNarME/00217.wav\n",
      "Label: 9171\n"
     ]
    }
   ],
   "source": [
    "for i in range(10):\n",
    "    f = random.choice(files_250)\n",
    "    print(\"File:\",f )\n",
    "    print(\"Label:\", get_250speakers_label(f))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "DBMelSpec = SpectrogramTransformer(mel=True, to_db=True)\n",
    "a2s = DBMelSpec()\n",
    "crop_4000ms = CropSignal(4000)\n",
    "tfms = [crop_4000ms, a2s]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "auds = DataBlock(blocks=(AudioBlock, CategoryBlock),  \n",
    "                 get_items=get_audio_files, \n",
    "                 splitter=RandomSplitter(),\n",
    "                 item_tfms=tfms,\n",
    "                 get_y=get_250speakers_label)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "dbunch250 = auds.dataloaders(p250speakers, item_tfms=tfms, bs=64)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = Learner(dbunch250, \n",
    "                xresnet18(),\n",
    "                torch.nn.CrossEntropyLoss(), \n",
    "                metrics=[accuracy])\n",
    "nchannels = dbunch250.one_batch()[0].shape[1]\n",
    "alter_learner(learn, nchannels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2.019546</td>\n",
       "      <td>3.296580</td>\n",
       "      <td>0.318217</td>\n",
       "      <td>02:25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.977203</td>\n",
       "      <td>1.188844</td>\n",
       "      <td>0.704624</td>\n",
       "      <td>01:06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.480721</td>\n",
       "      <td>0.685647</td>\n",
       "      <td>0.827455</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.187910</td>\n",
       "      <td>0.337231</td>\n",
       "      <td>0.917031</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.065858</td>\n",
       "      <td>0.274054</td>\n",
       "      <td>0.936177</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(5, lr_max=slice(2e-2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>0.051705</td>\n",
       "      <td>0.270194</td>\n",
       "      <td>0.937633</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.038327</td>\n",
       "      <td>0.269290</td>\n",
       "      <td>0.938417</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.032395</td>\n",
       "      <td>0.278114</td>\n",
       "      <td>0.938081</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.023054</td>\n",
       "      <td>0.270104</td>\n",
       "      <td>0.941328</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.021553</td>\n",
       "      <td>0.266977</td>\n",
       "      <td>0.940096</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.unfreeze()\n",
    "learn.fit_one_cycle(5, lr_max=slice(1e-3))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Customize our AudioToSpec Function using a config"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "voice_cfg = AudioConfig.Voice()\n",
    "a2s = AudioToSpec.from_cfg(voice_cfg)\n",
    "tfms = [crop_4000ms, a2s]\n",
    "auds.item_tfms = tfms\n",
    "# tfms = Pipeline([CropSignal(4000),  a2s, MaskFreq(size=12), MaskTime(size=15), SGRoll()], as_item=True)\n",
    "dbunch250B = auds.dataloaders(p250speakers, bs=128)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = Learner(dbunch250B, \n",
    "                xresnet18(),\n",
    "                torch.nn.CrossEntropyLoss(), \n",
    "                metrics=[accuracy])\n",
    "nchannels = dbunch250B.one_batch()[0].shape[1]\n",
    "alter_learner(learn, nchannels)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>2.466330</td>\n",
       "      <td>3.021362</td>\n",
       "      <td>0.358526</td>\n",
       "      <td>03:47</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>0.995521</td>\n",
       "      <td>1.866500</td>\n",
       "      <td>0.591871</td>\n",
       "      <td>03:45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>0.462063</td>\n",
       "      <td>0.616858</td>\n",
       "      <td>0.842123</td>\n",
       "      <td>03:45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>0.170015</td>\n",
       "      <td>0.328435</td>\n",
       "      <td>0.922629</td>\n",
       "      <td>03:45</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>0.056494</td>\n",
       "      <td>0.241049</td>\n",
       "      <td>0.947486</td>\n",
       "      <td>03:45</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Better results even without fine tuning, but much slower. We need to move a2s to the GPU and \n",
    "# then add data augmentation!\n",
    "learn.fit_one_cycle(5, lr_max=slice(2e-2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training an MFCC with Delta"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# only grab 1500ms of the clip, voice identity can be done with shorter sections and it will speed it up\n",
    "# this is really slow for mfcc, even for 45k files, need to figure out what's going on here. Also the results\n",
    "# shouldn't be this much worse than melspectrogram\n",
    "a2mfcc = AudioToMFCC(n_mffc=20, melkwargs={\"n_fft\":2048, \"hop_length\":256, \"n_mels\":128})\n",
    "tfms = [CropSignal(1500), a2mfcc, Delta()]\n",
    "auds.item_tfms = tfms\n",
    "# tfms = Pipeline([CropSignal(4000),  a2s, MaskFreq(size=12), MaskTime(size=15), SGRoll()], as_item=True)\n",
    "dbunch_mfcc = auds.dataloaders(p250speakers, bs=1024)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.Size([1024, 3, 40, 94])"
      ]
     },
     "execution_count": null,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#n_mfcc isn't getting passed down? \n",
    "dbunch_mfcc.one_batch()[0].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "learn = Learner(dbunch_mfcc, \n",
    "                xresnet18(),\n",
    "                torch.nn.CrossEntropyLoss(), \n",
    "                metrics=[accuracy])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.lr_find()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: left;\">\n",
       "      <th>epoch</th>\n",
       "      <th>train_loss</th>\n",
       "      <th>valid_loss</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>time</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>0</td>\n",
       "      <td>4.415287</td>\n",
       "      <td>10.876987</td>\n",
       "      <td>0.041765</td>\n",
       "      <td>01:07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>3.109825</td>\n",
       "      <td>3.805093</td>\n",
       "      <td>0.246669</td>\n",
       "      <td>01:04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>2.237656</td>\n",
       "      <td>1.826307</td>\n",
       "      <td>0.563207</td>\n",
       "      <td>01:05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>1.624857</td>\n",
       "      <td>1.171841</td>\n",
       "      <td>0.707871</td>\n",
       "      <td>01:04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>4</td>\n",
       "      <td>1.202367</td>\n",
       "      <td>0.962022</td>\n",
       "      <td>0.765424</td>\n",
       "      <td>01:05</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "learn.fit_one_cycle(5, lr_max=slice(2e-2))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class='alert alert-block alert-info'><strong>From Here:</strong><br>\n",
    "    1. Get transforms on the GPU <br>\n",
    "    2. Once it's faster test signal and spectrogram augments for speed/efficacy<br>\n",
    "    3. Fine-tune and see how high we can push results on 250 speakers\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Converted 00_core.ipynb.\n",
      "Converted 01_augment.ipynb.\n",
      "This cell doesn't have an export destination and was ignored:\n",
      "e\n",
      "Converted 02_tutorial.ipynb.\n",
      "Converted index.ipynb.\n"
     ]
    }
   ],
   "source": [
    "#hide\n",
    "from nbdev.export import notebook2script\n",
    "notebook2script()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
